EL PROBLEMA P vs. NP

Uno de los 7 problemas del milenio

“La cuestión más importante de toda la informática y uno de los más importantes de las matemáticas” (Lance Fortnow)

“Un regalo a las matemáticas de la informática” (Steve Smale)



El Problema P vs. NP

La teoría de la complejidad computacional

La teoría de la complejidad computacional estudia la complejidad asociada a los problemas que se resuelven computacionalmente. Para ello, estudia todos los posibles algoritmos que pueden usarse y también clasifica los problemas en función de los recursos computacionales necesarios, que son básicamente de dos tipos:
  1. El tiempo necesario para resolver el problema, que es proporcional (o está directamente relacionado) con el número de pasos u operaciones elementales.

  2. El espacio o memoria necesaria.
Se habla de complejidad temporal y espacial, respectivamente. Otras medidas de complejidad computacional que pueden considerarse, en función del tipo de problema, son: el número de procesadores, la cantidad de datos de comunicación, el número de puertas lógicas, etc.

La teoría de la complejidad computacional difiere de otras teorías y conceptos relacionados:
Problemas decidibles e indecidibles

Un problema decidible es un problema cuyo resultado es uno entre dos valores posibles: “sí” o “no”, 0 o 1, verdadero o falso, etc. Por ejemplo, el problema de averiguar si un número es o no primo es decidible.

Un problema indecidible es un problema cuya solución tendría en principio también dos valores posibles, pero que es imposible conocer. El ejemplo paradigmático es el famoso problema de la parada de una máquina de Turing: dada una máquina de Turing M y una entrada w, determinar si M terminará deteniéndose tras un número finito de pasos. Alan Turing demostró que este problema es indecidible. Otro ejemplo es el teorema de incompletud (o indecibilidad) de Gödel: en un sistema axiomático formal que incluya los números naturales, hay sentencias que no se puede demostrar que sean verdaderas o falsas.

Hartmanis & Stearn [1965] demostraron la existencia de problemas decidibles con arbitrariamente alta complejidad computacional. Usaron para ello un método de diagonalización, método que se remonta a Cantor, que lo utilizó para demostrar la no numerabilidad de los números reales.


Tipos de problemas computacionales

De acuerdo con el tiempo necesario para su resolución (complejidad temporal), los problemas computacionales que dependen de una variable x, asociada a la magnitud de la complejidad temporal del problema (normalmente, el tamaño de la entrada), se pueden dividir en dos clases:
  1. Problemas computacionales que se resuelven en tiempo polinómico, es decir, que el tiempo necesario para llegar a la solución o resultado es del tipo c·xk, o más general, del tipo c0 + c1·x + c2·x2 + ... + ck·xk, en donde los ci son constantes. La complejidad temporal, en general, se suele expresar como O(xr), siendo r un número real (se especifica solo la potencia de mayor exponente y donde la letra “O” significa “del orden de”). Los problemas más sencillos son los del tipo O(x), es decir, de tiempo computacional proporcional a x. Los algoritmos de tiempo polinómico se denominan también “tratables” o “factibles”. Ejemplos:


  2. Problemas que para resolverse necesitan un tiempo exponencial, es decir, que se necesita un tiempo del tipo k·cx, en donde k y c son números reales. Esta función puede crecer de forma extraordinariamente rápida a medida que aumenta x. La complejidad temporal es O(cx). Los problemas de tipo combinatorio suelen tener este tipo de complejidad. Los algoritmos de tiempo exponencial se denominan también “intratables” o “no factibles”
Ejemplos de este segundo tipo son:

Las clases P y NP

Se denomina “clase P” a la clase de problemas que pueden resolverse en tiempo polinómico.

Se denomina “clase NP” a la clase de problemas cuya solución puede verificarse en tiempo polinómico.

Según estas dos definiciones, P es un subconjunto de NP (P ⊂ NP), pues si es posible resolver un problema en tiempo polinómico, la solución obtenida también se puede verificar en tiempo polinómico.

Puede ocurrir que para ciertos problemas P, el tiempo de verificación sea el mismo que el de resolución. Por ejemplo, la verificación de la suma de dos números requiere realizar la propia suma. Por lo que, paradójicamente, a veces es más fácil verificar la solución de un problema complejo que el de un problema simple.

Dentro de la clase NP hay problemas fáciles (NP-fácil o NP-easy), los que se resuelven en tiempo polinómico, y problemas difíciles (NP-difícil o NP-hard), los que requieren tiempo exponencial. Según esta definición, NP-fácil = P.


La cuestión P vs. NP

El problema que se plantea es si P = NP o si P ≠ NP, es decir, si todos los problemas cuyas posibles soluciones se pueden calcular en tiempo polinómico, es igual o distinto de los problemas que pueden verificarse en tiempo polinómico.

Por ejemplo, el problema de la suma de subconjuntos es de tipo NP, pero como todavía no se ha encontrado un algoritmo eficiente que resuelva el problema en tiempo polinómico, no sabemos si es de tipo P o no.

La cuestión P =? NP es profunda y básica a la vez. Es una de las cuestiones abiertas más importantes en informática, por sus grandes implicaciones teóricas, prácticas e incluso filosóficas, y que suscita varias interrogantes: Una posible forma de demostrar que P ≠ NP es tratar de encontrar un problema o una clase de problemas en NP−P, es decir que sea NP pero no P.

En cualquier caso, sean P y NP iguales o no, tratar de encontrar la relación existente entre P y NP es fundamental para comprender la naturaleza profunda de la computación.


La clase NP-completa

El problema de la suma de subconjuntos, el problema del viajante y el problema del encaje de cajas son problemas combinatorios que comparten una interesante propiedad: en esencia, en el fondo, “todos son el mismo problema”, en el sentido de que, de existir un algoritmo eficiente para uno de ellos, también existirían algoritmos eficientes para los demás. Esta clase de problemas se denomina “NP-completa” y son los problemas de mayor dificultad de la clase NP. Todavía no se ha encontrado ningún algoritmo eficiente para ninguno de estos problemas. Si se encontrara un algoritmo eficiente para un problema NP-completo, esto implicaría que P = NP.

El descubrimiento de la clase NP-completa constituye un hito de enorme importancia, por varias razones: Aparte de los tres problemas mencionados, otros problemas NP-completos son: El problema de la factorización de un número natural, el problema del isomorfismo de grafos y el problema del logaritmo discreto son problemas NP, pero no se ha demostrado aún que sean NP-completos.


Problemas no-NP

En el problema de la suma de subconjuntos, si solo se pide un subconjunto que sume cero, es muy fácil de verificar que se trata de una solución. Si se piden todos los subconjuntos que verifiquen esta propiedad, la verificación exige repetir el proceso de nuevo para ver si se han incluido todas las soluciones. En este caso, el tiempo de resolución (exponencial) y el de verificación es el mismo, como ocurre normalmente con los problemas P.

Y lo mismo ocurre con el problema del viajante. Si solo se nos exige una camino que recorra todas las ciudades con una longitud total menor que una cierta longitud dada D, basta con chequear que el camino es cíclico, que están todas las ciudades y que la suma de distancias es menor que D. Pero si se nos pide el camino cíclico mínimo, la verificación exige repetir el proceso de resolución.

Este tipo de problemas, que requieren tiempo exponencial, tanto en la resolución como en la verificación, no son problemas NP, por lo que se denominan no-NP.


Esquema general de tipos de problemas

ResoluciónVerificaciónTipo de problema
PolinómicaPolinómicaNP-fácil = P
ExponencialPolinómicaNP-difícil ⊃ NP-completo
ExponencialNo-NP


Las dos alternativas (P vs. NP) y sus consecuencias

Si P ≠ NP, entonces: Si P = NP, entonces las consecuencias serían muy importantes, entre ellas:
Algunas reflexiones y opiniones sobre la cuestión P vs. NP
Las Vías para Disminuir la Complejidad Computacional

Existen dos formas de intentar disminuir la complejidad computacional de los problemas: la vía práctica y la vía teórica.

La vía práctica trata de intentar superar las limitaciones de los ordenadores digitales actuales mediante la utilización de modelos computacionales físicos alternativos, como los siguientes: La vía teórica trata de utilizar algoritmos eficientes especiales, como los siguientes:
El Problema P vs. NP desde el Paradigma MENTAL

Cuestiones generales
La cuestión de los dos modos de conciencia

La cuestión P vs. NP es, una vez más, un caso particular de la bipolaridad universal, representado o simbolizado por las características de los dos modos de conciencia de los hemisferios cerebrales. En este caso, los polos son los problemas computacionales NP-fáciles y NP-difíciles. En efecto: Hay una gradación continua, no hay una frontera concreta entre ambos, sino difusa. En efecto, el problema NP-fácil vs. NP-difícil es difuso si se platea en términos de eficiencia, pues hace equivalente lo eficiente y el tiempo polinómico. Pero los algoritmos de tiempo polinómico no siempre son factibles o tratables. Por ejemplo, un algoritmo que requiera n100 pasos no podría ejecutarse en un tiempo razonable, incluso con un valor de n pequeño (por ejemplo, 10), pues el número resultante (10100) es mayor que el número de átomos en el universo (1077). Y no todo algoritmo de tiempo exponencial es intratable. La frontera, pues, entre tiempo polinómico y tiempo exponencial es un tanto difusa.

Encontrar un algoritmo eficiente para un problema es traerlo a la conciencia. Pero hay que ir ganando terreno al inconsciente. Este es el proceso de la ciencia, de la conciencia y la evolución. Si un problema NP-difícil no puede resolverse como NP-fácil, hay que intentar optimizarlo, rebajando en lo posible su grado de complejidad temporal.

Para los problemas fáciles (los de tiempo polinómico) basta con utilizar la razón. Los problemas difíciles (en los de tiempo exponencial) nos conducen a espacios amplios, de muchas posibilidades, que desbordan nuestra capacidad normal de análisis, por lo que hay que contemplarlos desde un punto de vista superior y utilizar la creatividad, la intuición y la imaginación, aplicando por ejemplo reglas de tipo heurístico que generen comprensión. La fuerza bruta es la búsqueda a ciegas, sin rumbo, sin conciencia. Cuando hay una heurística, la búsqueda de soluciones se simplifica, hay rumbo, más conciencia del problema, pues en la heurística está codificado el objetivo.

Por lo tanto, la problemática P vs. NP no es más que la problemática universal de los dos modos de conciencia. El punto de encuentro de ambos modos se encuentra en los arquetipos primarios, en las primitivas semánticas universales que representan el supremo nivel de abstracción.


La cuestión del modelo computacional

La máquina de Turing es el modelo computacional habitualmente utilizado como referencia en la cuestión P vs. NP. Este modelo, introducido por Alan Turing en 1936, es de tipo teórico y fue introducido antes de que se construyeran los primeros ordenadores digitales. La máquina de Turing no considera el aspecto de complejidad computacional; solo si se pueden implementar algoritmos que sean capaces de producir un resultado, sin límite de tiempo ni espacio (la cinta ilimitada de la máquina). La máquina de Turing establece los límites de la computación, y ningún modelo computacional alternativo puede superar este límite.

Sin embargo, este modelo es superficial, de bajo nivel, de detalle. No favorece la creatividad, tan necesaria para resolver los problemas NP-difíciles. La alternativa es MENTAL, un lenguaje que aporta un nuevo modelo de computacional basado en grados de libertad, flexible, abierto y creativo. La creatividad máxima surge desde lo profundo, desde el nivel de la suprema abstracción. Desde este modelo, todo los problemas se ven más simples, todo se clarifica y simplifica porque se contempla todo desde las puertas de la conciencia: las primitivas semánticas universales. MENTAL aporta un nuevo paradigma, un paradigma de tipo unificador que nos permite ver con nuevos ojos viejos problemas, en particular el problema P vs. NP.

MENTAL es un lenguaje conceptual, teórico, ideal (como la máquina de Turing), que es independiente de los recursos físicos disponibles. Por ejemplo, si no existen ciertos recursos (como el paralelismo de expresiones), hay que simularlos. Es, en definitiva, el problema de la competencia (o poder computacional teórico) frente a la eficiencia (el poder computacional práctico con los recursos disponibles).

Con MENTAL se pueden crear algoritmos más eficientes y creativos que los tradicionales gracias a sus recursos computacionales flexibles de alto nivel, entre los que podemos destacar: Gracias a estos recursos, la complejidad computacional debe disminuir, en el sentido de necesitar menos recursos temporales y espaciales.


Conclusiones
  1. P no es igual a NP, porque NP-fácil y NP-difícil son dos polos o extremos de la complejidad. Pero ambas clases de complejidad comparten la misma esencia computacional, los mismos arquetipos primarios, las primitivas semánticas universales.

  2. La verdadera naturaleza de la computación no surge de la resolución del problema P vs. NP, sino de la identificación de los recursos profundos, de alto nivel de abstracción que son las primitivas semánticas universales.

  3. El tema P vs. NP es independiente de la axiomática ZF de la teoría de conjuntos. Pero existe una cierta analogía, pues las primitivas semánticas universales desempeñan un papel análogo al de los axiomas de la teoría de conjuntos. Son axiomas semánticos.

  4. Con MENTAL no se obtienen todos los beneficios previstos si se cumpliera que P = NP, pero sí los siguientes:

En definitiva, el problema de la complejidad es el problema de encontrar la simplicidad computacional, simplicidad que se logra con los arquetipos de la conciencia. Paradójicamente, la teoría de la complejidad computacional es la teoría de la simplicidad computacional.



Adenda

El premio del Instituto Clay

El 24 de Mayo de 2000, el Instituto Clay de Matemáticas (con sede en Cambridge, Massachusetts), con ocasión de un congreso en París, ofreció un premio de un millón de dólares para la persona que resolviera uno del los “7 problemas del milenio”, problemas que la comunidad matemática considera importantes y a la vez difíciles de resolver. El año 2000 fue declarado por la Unesco “Año Mundial de las Matemáticas”, cien años después de que Hilbert enunciara sus famosos 23 problemas en el Congreso Internacional de Matemáticos, que tuvo lugar también en Paris.

En el año 2003, el matemático ruso Grigori Perelman resolvió uno de ellos: la conjetura de Poincaré (ahora convertido en teorema). Los otros 6 siguen sin resolverse. Uno de ellos es precisamente el problema P vs. NP. Pero se cree que si se resolviera esta problema, probablemente también se resolverían los demás.


Un poco de historia
La demostración de Deolalikar de P ≠ NP

Vinay Deolalikar, un matemático indio que trabaja en HP Research Labs en Palo Alto (California), publicó un artículo el 6 Agosto 2010 en el que afirmaba haber demostrado que P ≠ NP. Su demostración se basa en que si ciertos problemas, que se sabe que son NP completos, estuvieran también en P, entonces tendrían propiedades estadísticas imposibles. El artículo de Deolalikar, que ha sido actualizado varias veces para corregir algunos errores que le han detectado, es muy complejo (tiene 102 páginas) y deberá pasar cierto tiempo hasta que su demostración sea totalmente verificada y aceptada.

Lo que es interesante del artículo es que el autor utiliza un nuevo método de investigación, pues combina dos enfoques diferentes: la lógica y la física estadística. Trasladó el problema computacional P vs. NP al mundo de la lógica formal, utilizado la “teoría de modelos finitos” (finite model theory). Se centró en un problema SAT (satisfacibilidad booleana) desde la perspectiva siguiente: si k es el número de expresiones lógicas de n variables booleanas y se eligen al azar un número de n dígitos binarios, ¿cual es la probabilidad de que ese número satisfaga esas expresiones lógicas?. Si k es muy grande y el número de soluciones posibles es pequeño, nunca habrá soluciones correctas, independientemente del tiempo que se invierta. Si k es pequeño y n es grande, siempre habrá soluciones. En un cierto punto intermedio entre ambos extremos hay soluciones y una rica estructura de distribuciones de probabilidad. Según el autor, como las restricciones de los algoritmos de tiempo polinómico son demasiado grandes para producir esta rica estructura, deduce que P ≠ NP.


Bibliografía